home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.5 Applications 2004 May / SGI IRIX 6.5 Applications 2004 May.iso / dist / java3d.idb / usr / demos / java / j3d / programs / examples / TickTockPicking / TickTockPicking.java.z / TickTockPicking.java
Encoding:
Java Source  |  2003-08-08  |  12.9 KB  |  442 lines

  1. /*
  2.  *    @(#)TickTockPicking.java 1.28 02/10/21 13:58:21
  3.  *
  4.  * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * - Redistribution in binary form must reproduce the above copyright
  14.  *   notice, this list of conditions and the following disclaimer in
  15.  *   the documentation and/or other materials provided with the
  16.  *   distribution.
  17.  *
  18.  * Neither the name of Sun Microsystems, Inc. or the names of
  19.  * contributors may be used to endorse or promote products derived
  20.  * from this software without specific prior written permission.
  21.  *
  22.  * This software is provided "AS IS," without a warranty of any
  23.  * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
  24.  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
  25.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
  26.  * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
  27.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  28.  * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
  29.  * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
  30.  * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
  31.  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
  32.  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
  33.  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  34.  *
  35.  * You acknowledge that Software is not designed,licensed or intended
  36.  * for use in the design, construction, operation or maintenance of
  37.  * any nuclear facility.
  38.  */
  39.  
  40. import java.applet.Applet;
  41. import java.awt.*;
  42. import java.awt.event.*;
  43. import com.sun.j3d.utils.applet.MainFrame;
  44. import com.sun.j3d.utils.universe.*;
  45. import com.sun.j3d.utils.image.TextureLoader;
  46. import javax.media.j3d.*;
  47. import javax.vecmath.*;
  48.  
  49. public class TickTockPicking extends Applet {
  50.  
  51.     // path the the texture map image
  52.     private java.net.URL texImage = null;
  53.  
  54.     private SimpleUniverse u = null;
  55.     
  56.     public BranchGroup createSceneGraph(Canvas3D c) {
  57.     // Create the root of the branch graph
  58.     BranchGroup objRoot = new BranchGroup();
  59.  
  60.         // Create a Transformgroup to scale all objects so they
  61.         // appear in the scene.
  62.         TransformGroup objScale = new TransformGroup();
  63.         Transform3D t3d = new Transform3D();
  64.         t3d.setScale(0.4);
  65.         objScale.setTransform(t3d);
  66.         objRoot.addChild(objScale);
  67.  
  68.     // Create a bounds for the background and behaviors
  69.     BoundingSphere bounds =
  70.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  71.  
  72.     // Set up the background
  73.     Color3f bgColor = new Color3f(0.05f, 0.05f, 0.2f);
  74.     Background bg = new Background(bgColor);
  75.     bg.setApplicationBounds(bounds);
  76.     objScale.addChild(bg);
  77.  
  78.     // Set up the global lights
  79.     Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
  80.     Vector3f lDir1  = new Vector3f(-1.0f, -1.0f, -1.0f);
  81.     Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
  82.  
  83.     AmbientLight aLgt = new AmbientLight(alColor);
  84.     aLgt.setInfluencingBounds(bounds);
  85.     DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
  86.     lgt1.setInfluencingBounds(bounds);
  87.     objScale.addChild(aLgt);
  88.     objScale.addChild(lgt1);
  89.  
  90.     // Create a pair of transform group nodes and initialize them to
  91.     // identity.  Enable the TRANSFORM_WRITE capability so that
  92.     // our behaviors can modify them at runtime.  Add them to the
  93.     // root of the subgraph.
  94.     TransformGroup objTrans1 = new TransformGroup();
  95.     objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  96.     objScale.addChild(objTrans1);
  97.  
  98.     TransformGroup objTrans2 = new TransformGroup();
  99.     objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  100.     objTrans1.addChild(objTrans2);
  101.  
  102.     // Create the positioning and scaling transform group node.
  103.     Transform3D t = new Transform3D();
  104.     t.set(0.3, new Vector3d(0.0, -1.5, 0.0));
  105.     TransformGroup objTrans3 = new TransformGroup(t);
  106.     objTrans2.addChild(objTrans3);
  107.  
  108.     // Create a simple shape leaf node, set it's appearance, and
  109.     // add it to the scene graph.
  110.     Shape3D shape = new Cube();
  111.     Appearance a = new Appearance();
  112.     Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
  113.     Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
  114.     Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
  115.     a.setMaterial(new Material(objColor, black, objColor,
  116.                    white, 80.0f));
  117.     shape.setAppearance(a);
  118.     shape.setCapability(shape.ALLOW_APPEARANCE_READ);
  119.     shape.setCapability(shape.ALLOW_APPEARANCE_WRITE);
  120.     objTrans3.addChild(shape);
  121.  
  122.     // Create a new Behavior object that will perform the desired
  123.     // rotation on the specified transform object and add it into
  124.     // the scene graph.
  125.     Transform3D yAxis1 = new Transform3D();
  126.     yAxis1.rotX(Math.PI/2.0);
  127.     Alpha tickTockAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE |
  128.                     Alpha.DECREASING_ENABLE,
  129.                     0, 0,
  130.                     5000, 2500, 200,
  131.                     5000, 2500, 200);
  132.  
  133.     RotationInterpolator tickTock =
  134.         new RotationInterpolator(tickTockAlpha, objTrans1, yAxis1,
  135.                      -(float) Math.PI/2.0f,
  136.                      (float) Math.PI/2.0f);
  137.     tickTock.setSchedulingBounds(bounds);
  138.     objTrans2.addChild(tickTock);
  139.  
  140.     // Create a new Behavior object that will perform the desired
  141.     // rotation on the specified transform object and add it into
  142.     // the scene graph.
  143.     Transform3D yAxis2 = new Transform3D();
  144.     Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
  145.                     0, 0,
  146.                     4000, 0, 0,
  147.                     0, 0, 0);
  148.  
  149.     RotationInterpolator rotator =
  150.         new RotationInterpolator(rotationAlpha, objTrans2, yAxis2,
  151.                      0.0f, (float) Math.PI*2.0f);
  152.     rotator.setSchedulingBounds(bounds);
  153.     objTrans2.addChild(rotator);
  154.  
  155.     // Now create the simple picking behavior
  156.     PickHighlightBehavior pickBeh = new 
  157.       PickHighlightBehavior(c, objRoot, bounds);
  158.  
  159.     // Create a bunch of objects with a behavior and add them
  160.     // into the scene graph.
  161.  
  162.     int row, col;
  163.     Appearance[][] app = new Appearance[3][3];
  164.  
  165.     for (row = 0; row < 3; row++)
  166.         for (col = 0; col < 3; col++)
  167.         app[row][col] = createAppearance(row * 3 + col);
  168.  
  169.     for (int i = 0; i < 3; i++) {
  170.         double ypos = (double)(i - 1) * 1.5;
  171.         for (int j = 0; j < 3; j++) {
  172.         double xpos = (double)(j - 1) * 1.5;
  173.         objScale.addChild(createObject(app[i][j], 0.3,  xpos, ypos));
  174.         }
  175.     }
  176.  
  177.         // Have Java 3D perform optimizations on this scene graph.
  178.         objRoot.compile();
  179.  
  180.     return objRoot;
  181.     }
  182.  
  183.  
  184.     private Appearance createAppearance(int idx) {
  185.     Appearance app = new Appearance();
  186.  
  187.     // Globally used colors
  188.     Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
  189.     Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
  190.  
  191.     switch (idx) {
  192.     // Unlit solid
  193.     case 0:
  194.         {
  195.         // Set up the coloring properties
  196.         Color3f objColor = new Color3f(1.0f, 0.2f, 0.4f);
  197.         ColoringAttributes ca = new ColoringAttributes();
  198.         ca.setColor(objColor);
  199.         app.setColoringAttributes(ca);
  200.         break;
  201.         }
  202.  
  203.  
  204.     // Unlit wire frame
  205.     case 1:
  206.         {
  207.         // Set up the coloring properties
  208.         Color3f objColor = new Color3f(1.0f, 0.4f, 0.0f);
  209.         ColoringAttributes ca = new ColoringAttributes();
  210.         ca.setColor(objColor);
  211.         app.setColoringAttributes(ca);
  212.  
  213.         // Set up the polygon attributes
  214.         PolygonAttributes pa = new PolygonAttributes();
  215.         pa.setPolygonMode(pa.POLYGON_LINE);
  216.         pa.setCullFace(pa.CULL_NONE);
  217.         app.setPolygonAttributes(pa);
  218.         break;
  219.         }
  220.  
  221.     // Unlit points
  222.     case 2:
  223.         {
  224.         // Set up the coloring properties
  225.         Color3f objColor = new Color3f(1.0f, 1.0f, 0.0f);
  226.         ColoringAttributes ca = new ColoringAttributes();
  227.         ca.setColor(objColor);
  228.         app.setColoringAttributes(ca);
  229.  
  230.         // Set up the polygon attributes
  231.         PolygonAttributes pa = new PolygonAttributes();
  232.         pa.setPolygonMode(pa.POLYGON_POINT);
  233.         pa.setCullFace(pa.CULL_NONE);
  234.         app.setPolygonAttributes(pa);
  235.  
  236.         // Set up point attributes
  237.         PointAttributes pta = new PointAttributes();
  238.         pta.setPointSize(5.0f);
  239.         app.setPointAttributes(pta);
  240.         break;
  241.         }
  242.  
  243.     // Lit solid
  244.     case 3:
  245.         {
  246.         // Set up the material properties
  247.         Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
  248.         app.setMaterial(new Material(objColor, black, objColor,
  249.                          white, 80.0f));
  250.         break;
  251.         }
  252.  
  253.     // Texture mapped, lit solid
  254.     case 4:
  255.         {
  256.         // Set up the texture map
  257.         TextureLoader tex = new TextureLoader(texImage, this);
  258.         app.setTexture(tex.getTexture());
  259.  
  260.         TextureAttributes texAttr = new TextureAttributes();
  261.         texAttr.setTextureMode(TextureAttributes.MODULATE);
  262.         app.setTextureAttributes(texAttr);
  263.  
  264.         // Set up the material properties
  265.         app.setMaterial(new Material(white, black, white, black, 1.0f));
  266.         break;
  267.         }
  268.  
  269.     // Transparent, lit solid
  270.     case 5:
  271.         {
  272.         // Set up the transparency properties
  273.         TransparencyAttributes ta = new TransparencyAttributes();
  274.         ta.setTransparencyMode(ta.BLENDED);
  275.         ta.setTransparency(0.6f);
  276.         app.setTransparencyAttributes(ta);
  277.  
  278.         // Set up the polygon attributes
  279.         PolygonAttributes pa = new PolygonAttributes();
  280.         pa.setCullFace(pa.CULL_NONE);
  281.         app.setPolygonAttributes(pa);
  282.  
  283.         // Set up the material properties
  284.         Color3f objColor = new Color3f(0.7f, 0.8f, 1.0f);
  285.         app.setMaterial(new Material(objColor, black, objColor,
  286.                          black, 1.0f));
  287.         break;
  288.         }
  289.  
  290.     // Lit solid, no specular
  291.     case 6:
  292.         {
  293.         // Set up the material properties
  294.         Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
  295.         app.setMaterial(new Material(objColor, black, objColor,
  296.                          black, 80.0f));
  297.         break;
  298.         }
  299.  
  300.     // Lit solid, specular only
  301.     case 7:
  302.         {
  303.         // Set up the material properties
  304.         Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
  305.         app.setMaterial(new Material(black, black, black,
  306.                          white, 80.0f));
  307.         break;
  308.         }
  309.  
  310.     // Another lit solid with a different color
  311.     case 8:
  312.         {
  313.         // Set up the material properties
  314.         Color3f objColor = new Color3f(0.8f, 0.8f, 0.0f);
  315.         app.setMaterial(new Material(objColor, black, objColor,
  316.                          white, 80.0f));
  317.         break;
  318.         }
  319.  
  320.     default:
  321.         {
  322.         ColoringAttributes ca = new ColoringAttributes();
  323.         ca.setColor(new Color3f(0.0f, 1.0f, 0.0f));
  324.         app.setColoringAttributes(ca);
  325.         }
  326.     }
  327.  
  328.     return app;
  329.     }
  330.  
  331.  
  332.     private Group createObject(Appearance app, double scale,
  333.                    double xpos, double ypos) {
  334.  
  335.     // Create a transform group node to scale and position the object.
  336.     Transform3D t = new Transform3D();
  337.     t.set(scale, new Vector3d(xpos, ypos, 0.0));
  338.     TransformGroup objTrans = new TransformGroup(t);
  339.  
  340.     // Create a second transform group node and initialize it to the
  341.     // identity.  Enable the TRANSFORM_WRITE capability so that
  342.     // our behavior code can modify it at runtime.
  343.     TransformGroup spinTg = new TransformGroup();
  344.     spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  345.     spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  346.  
  347.     // Create a simple shape leaf node and set the appearance
  348.     Shape3D shape = new Tetrahedron();
  349.     shape.setAppearance(app);
  350.     shape.setCapability(shape.ALLOW_APPEARANCE_READ);
  351.     shape.setCapability(shape.ALLOW_APPEARANCE_WRITE);
  352.  
  353.     // add it to the scene graph.
  354.     spinTg.addChild(shape);
  355.  
  356.     // Create a new Behavior object that will perform the desired
  357.     // operation on the specified transform object and add it into
  358.     // the scene graph.
  359.     Transform3D yAxis = new Transform3D();
  360.     Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
  361.                     0, 0,
  362.                     5000, 0, 0,
  363.                     0, 0, 0);
  364.  
  365.     RotationInterpolator rotator =
  366.         new RotationInterpolator(rotationAlpha, spinTg, yAxis,
  367.                      0.0f, (float) Math.PI*2.0f);
  368.  
  369.     BoundingSphere bounds =
  370.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  371.  
  372.     rotator.setSchedulingBounds(bounds);
  373.  
  374.     // Add the behavior and the transform group to the object
  375.     objTrans.addChild(rotator);
  376.     objTrans.addChild(spinTg);
  377.  
  378.     return objTrans;
  379.     }
  380.  
  381.  
  382.     public TickTockPicking() {
  383.     }
  384.  
  385.     public TickTockPicking(java.net.URL url) {
  386.     texImage = url;
  387.     }
  388.  
  389.     public void init() {
  390.     if (texImage == null) {
  391.         // the path to the image for an applet
  392.         try {
  393.         texImage = new java.net.URL(getCodeBase().toString() +
  394.                        "../images/apimage.jpg");
  395.         }
  396.         catch (java.net.MalformedURLException ex) {
  397.         System.out.println(ex.getMessage());
  398.         System.exit(1);
  399.         }
  400.     }
  401.  
  402.     setLayout(new BorderLayout());
  403.         GraphicsConfiguration config =
  404.            SimpleUniverse.getPreferredConfiguration();
  405.  
  406.         Canvas3D c = new Canvas3D(config);
  407.     add("Center", c);
  408.  
  409.     // Create a simple scene and attach it to the virtual universe
  410.     BranchGroup scene = createSceneGraph(c);
  411.     u = new SimpleUniverse(c);
  412.  
  413.         // This will move the ViewPlatform back a bit so the
  414.         // objects in the scene can be viewed.
  415.         u.getViewingPlatform().setNominalViewingTransform();
  416.  
  417.     u.addBranchGraph(scene);
  418.  
  419.     }
  420.  
  421.     public void destroy() {
  422.     u.cleanup();
  423.     }
  424.     
  425.     //
  426.     // The following allows TickTockPicking to be run as an application
  427.     // as well as an applet
  428.     //
  429.     public static void main(String[] args) {
  430.     // the path the the texture map for an application
  431.     java.net.URL url = null;
  432.     try {
  433.         url = new java.net.URL("file:../images/apimage.jpg");
  434.     }
  435.     catch (java.net.MalformedURLException ex) {
  436.         System.out.println(ex.getMessage());
  437.         System.exit(1);
  438.     }
  439.     new MainFrame(new TickTockPicking(url), 700, 700);
  440.     }
  441. }
  442.